package com.wxzhou.wangzhuan.util;

import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;

/**
 * 字符集处理工具类
 * 用于处理MySQL字符集兼容性问题
 */
public class CharsetUtil {
    
    // emoji和4字节UTF-8字符的正则表达式
    private static final Pattern EMOJI_PATTERN = Pattern.compile(
        "[\\x{1F600}-\\x{1F64F}]|" +  // 表情符号
        "[\\x{1F300}-\\x{1F5FF}]|" +  // 杂项符号
        "[\\x{1F680}-\\x{1F6FF}]|" +  // 交通符号
        "[\\x{1F1E0}-\\x{1F1FF}]|" +  // 区域符号
        "[\\x{2600}-\\x{26FF}]|" +    // 杂项符号
        "[\\x{2700}-\\x{27BF}]"       // 装饰符号
    );
    
    /**
     * 清理字符串中的4字节UTF-8字符（emoji等）
     * 用于兼容只支持utf8（3字节）的数据库表
     * 
     * @param input 输入字符串
     * @return 清理后的字符串
     */
    public static String cleanFourByteUtf8(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }
        
        // 方法1：移除emoji
        String cleaned = EMOJI_PATTERN.matcher(input).replaceAll("");
        
        // 方法2：更彻底的4字节字符过滤
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < cleaned.length(); i++) {
            char c = cleaned.charAt(i);
            // 检查是否为4字节UTF-8字符
            if (Character.isSurrogate(c)) {
                // 跳过代理对（4字节字符）
                if (Character.isHighSurrogate(c) && i + 1 < cleaned.length()) {
                    i++; // 跳过低代理
                }
                result.append("?"); // 替换为问号或留空
            } else {
                result.append(c);
            }
        }
        
        return result.toString();
    }
    
    /**
     * 安全地截断字符串到指定字节长度
     * 确保不会在多字节字符中间截断
     * 
     * @param input 输入字符串
     * @param maxBytes 最大字节数
     * @return 截断后的字符串
     */
    public static String safeTruncate(String input, int maxBytes) {
        if (input == null) {
            return null;
        }
        
        byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
        if (bytes.length <= maxBytes) {
            return input;
        }
        
        // 向后搜索，找到完整字符的边界
        int truncateIndex = maxBytes;
        while (truncateIndex > 0 && (bytes[truncateIndex] & 0xC0) == 0x80) {
            truncateIndex--;
        }
        
        return new String(bytes, 0, truncateIndex, StandardCharsets.UTF_8);
    }
    
    /**
     * 检测字符串是否包含4字节UTF-8字符
     * 
     * @param input 输入字符串
     * @return 是否包含4字节字符
     */
    public static boolean containsFourByteUtf8(String input) {
        if (input == null || input.isEmpty()) {
            return false;
        }
        
        return EMOJI_PATTERN.matcher(input).find() || 
               input.chars().anyMatch(c -> Character.charCount(c) > 1);
    }
}